#include "temp.h"
#include "delay.h"

void DS18B20_Enable_GPIO_Port(void)
{
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOG,ENABLE);
}


void DS18B20_OUT_PULL_UP(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
}


void DS18B20_IN_PULL_UP(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
}



/* Reset */

void Reset_DS18B20(void) 
{
	DS18B20_OUT_PULL_UP();
	CLR_DQ();
	Delay_us(450);
	SET_DQ();
	Delay_us(60);
	DS18B20_IN_PULL_UP(); 
	Delay_us(10);
	while(!(GET_DQ()));
	DS18B20_OUT_PULL_UP();
	SET_DQ();
}

/* Read */
uint8_t Read_DS18B20(void)
{
    uint8_t data=0,i=0;
    for(i=0;i<8;i++)
    {
	DS18B20_OUT_PULL_UP();
	CLR_DQ();
	data=data>>1;
	SET_DQ();
	DS18B20_IN_PULL_UP();
	Delay_us(8);
	if(GET_DQ())data|=0x80;
	DS18B20_OUT_PULL_UP();
	SET_DQ();
	Delay_us(60);
    }
    return(data);
}

/* Write  Write_DS18B20 */
void Write_DS18B20(uint8_t data)
{
	uint8_t i=0;
	DS18B20_OUT_PULL_UP();
	SET_DQ();
	Delay_us(16);
	for(i=0;i<8;i++)
	{
		CLR_DQ();
		if(data&0x01)
		{
			SET_DQ();
		}
		else
		{
		CLR_DQ();
		}
		data=data>>1;
		Delay_us(40);  //65
		SET_DQ();
	}
}




void Convert_DS18B20(void) 
{ 
	Reset_DS18B20(); 
	Write_DS18B20(0xcc); 
	Write_DS18B20(0x44); 
}

//Read_ID
uint8_t* Read_ID(void) 
{ 
	uint8_t ID[8],i,*p;
	Reset_DS18B20(); 
	Write_DS18B20(0x33);
	for(i=0;i<8;i++)
	{ID[i]=Read_DS18B20();}
	p=ID;
	return p;
}

void DS18B20_Init(void)
{
	u8 i,*p,id[8];
	/**----------------------Read ID------------------------*/
	p=Read_ID();
	while(*p){id[i]=*p;p++;i++;}
	printf("DS18B20's ID :");
	i=0;
	while(i!=8)
		{printf("0x%x ",id[i]);i++;}
	printf("\n\r");

}

//Read_Temp
uint16_t Read_Temp(void) 
{ 
	uint8_t temp1,temp2;
	Convert_DS18B20();
	Reset_DS18B20(); 
	Write_DS18B20(0xcc); 
	Write_DS18B20(0xbe); 	
	temp1=Read_DS18B20(); 
	temp2=Read_DS18B20();
	Reset_DS18B20();
	return(((temp2 << 8 )|temp1)*6.25);  //0.0625=xx, 0.625=xx.x, 6.25=xx.xx

}


